# 使用mcr.microsoft.com/dotnet/sdk:6.0-alpine镜像作为构建镜像
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
# 修改apk源为腾讯镜像
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tencent.com/g' /etc/apk/repositories
# 设置工作目录为/source
WORKDIR /source

EXPOSE 8088
EXPOSE 443

# 复制所有解决方案文件到当前工作目录
COPY *.sln .
# 复制项目中的所有csproj文件到对应目录下
COPY Web/*.csproj ./Web/
COPY Models/*.csproj ./Models/
COPY BLL/*.csproj ./BLL/
COPY CoreHelper/*.csproj ./CoreHelper/
COPY Test/*.csproj ./Test/
COPY Senparc.Weixin.Sample.CommonService/*.csproj ./Senparc.Weixin.Sample.CommonService/

# 恢复项目的依赖项和工具
# -r  linux-musl-x64 指定程序包还原的运行时
# /p:PublishReadyToRun=true 可以通过将应用程序集编译为 ReadyToRun (R2R) 格式来改进 .NET Core 应用程序的启动时间和延迟
RUN dotnet restore -r linux-musl-x64 /p:PublishReadyToRun=true

# 复制项目中的所有文件到对应目录下
COPY Web/. ./Web/
COPY Models/. ./Models/
COPY BLL/. ./BLL/
COPY CoreHelper/. ./CoreHelper/
COPY Test/. ./Test/
COPY Senparc.Weixin.Sample.CommonService/. ./Senparc.Weixin.Sample.CommonService/

# 设置工作目录为/source/Web
WORKDIR /source/Web
# -c release 定义生成配置， 比如这里指定配置为release
# -o /app 指定输出目录的路径，这里输出目录为/app(此命令也可以是--output)
# -r linux-musl-x64 发布针对给定运行时的应用程序
# --self-contained true 开启自包含
# --no-restore 不恢复
# /p:PublishTrimmed=true 开启裁剪，开启有可能会发布失败，不开启程序可能会比较大
# /p:PublishReadyToRun=true 开启发布就绪
# /p:PublishSingleFile=true 输出单个文件
RUN dotnet publish -c release -o /app -r linux-musl-x64 --self-contained true --no-restore /p:PublishTrimmed=false /p:PublishReadyToRun=true /p:PublishSingleFile=true

# 使用mcr.microsoft.com/dotnet/runtime-deps:6.0-alpine-amd64镜像作为最终镜像，最后阶段
FROM mcr.microsoft.com/dotnet/runtime-deps:6.0-alpine-amd64

# 安装tzdata，设置时区为上海（容器默认时区为UTC，如需使用上海时间请启用以下时区设置命令）
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

# 安装ca-certificates（使用 HTTPS 协议访问容器云调用证书安装）
RUN apk add ca-certificates
# 修改apk源为腾讯镜像
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tencent.com/g' /etc/apk/repositories
# 设置工作目录为/app
WORKDIR /app
# 从构建镜像中复制/app目录下的所有文件到当前工作目录
COPY --from=build /app ./

# Uncomment to enable globalization APIs (or delete)取消注释以启用全球化API（或删除）
# ENV \
#     DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false \
#     LC_ALL=en_US.UTF-8 \
#     LANG=en_US.UTF-8
# RUN apk add --no-cache icu-libs

# 安装 ICU 库，如果需要
#RUN apk add --no-cache icu-libs

# If you need ICU with non-English locales and legacy charset support, install package icu-data-full.
# 如果您需要ICU非英语语言环境和遗留字符集支持，请安装包icu-data-full
#RUN apk add --no-cache icu-data-full

# # 设置启动命令, 注意字符串要换成你当前项目的dll名称
ENTRYPOINT ["./Web"]


#在Windows PowerShell中执行以下命令后可以在docker desktop中使用浏览器打开项目
#docker run -d -p 8088:80 web